package calculatorEngine;

import java.util.ArrayList;

public class CenterWeightProcessor {
	
	//jeszcze nie dziala
	/*public static double[] getPercentageCenterWeightDelta(ArrayList<Seat[]> mapaSiedzen, double[] idealnySrodekCiezkosci) {
		
		int numberOfSeatsInRow = mapaSiedzen.get(0).length;
		int numberOfRows = mapaSiedzen.size();
		
		double maxDeltaX = (numberOfSeatsInRow - 1) /2.0;
		double maxDeltaY = (numberOfRows - 1) /2.0;
		
		double[] centerWeight = getWeightCenter(mapaSiedzen);
		
		double centerWeightX = Math.abs(centerWeight[0] + idealnySrodekCiezkosci[0]);
		double centerWeightY = Math.abs(centerWeight[1] + idealnySrodekCiezkosci[1]);
		
		return new double[] { (maxDeltaX - centerWeightX) / maxDeltaX, (maxDeltaY - centerWeightY) / maxDeltaY};
		
	}*/
	
	public static double getPercentageBalance(ArrayList<Seat[]> mapaSiedzen, double[] idealnySrodekCiezkosci) {
		
		double idealnySrodekX = idealnySrodekCiezkosci[0];
		double idealnySrodekY = idealnySrodekCiezkosci[1];
		
		double dlugoscPolowySamolotu = (mapaSiedzen.size() -1) /2.0;
		double szerokoscPolowySamolotu = (mapaSiedzen.get(0).length -1) /2.0;
		
		double obecnySrodekX = getWeightCenter(mapaSiedzen)[0];
		double obecnySrodekY = getWeightCenter(mapaSiedzen)[1];
		
		obecnySrodekX -= idealnySrodekX;
		obecnySrodekY -= idealnySrodekY;
		
		double XY = Math.pow(Math.pow(obecnySrodekX, 2) + Math.pow(obecnySrodekY, 2), 0.5);
		
		double A = dlugoscPolowySamolotu + idealnySrodekY;
		double B = dlugoscPolowySamolotu - idealnySrodekY;
		
		double C = szerokoscPolowySamolotu + idealnySrodekX;
		double D = szerokoscPolowySamolotu - idealnySrodekX;
		
		double TOTAL = -1;
		
		// strefa I
		if (obecnySrodekX > 0 && obecnySrodekY < 0) {

			TOTAL = Math.pow(A*A + D*D, 0.5);

		}

		// strefa II
		else if (obecnySrodekX < 0 && obecnySrodekY < 0) {

			TOTAL = Math.pow(A*A + C*C, 0.5);

		}

		// strefa III
		else if (obecnySrodekX < 0 && obecnySrodekY > 0) {

			TOTAL = Math.pow(B*B + C*C, 0.5);

		}

		// strefa IV
		else if (obecnySrodekX > 0 && obecnySrodekY > 0) {

			TOTAL = Math.pow(B*B + D*D, 0.5);

		}

		// strefa V
		else if (obecnySrodekX == 0 && obecnySrodekY < 0) {

			TOTAL = A;

		}

		// strefa VI
		else if (obecnySrodekX < 0 && obecnySrodekY == 0) {

			TOTAL = C;

		}

		// strefa VII
		else if (obecnySrodekX == 0 && obecnySrodekY > 0) {

			TOTAL = B;

		}

		// strefa VIII
		else if (obecnySrodekX > 0 && obecnySrodekY == 0) {

			TOTAL = D;

		}

		// strefa IX
		else if (obecnySrodekX == 0 && obecnySrodekY == 0) {

			return 1;

		}
		
		return (double) 1 - (XY / TOTAL);
		
	}
	
	/*public static void GOCWD(ArrayList<Seat[]> mapaSiedzen, double[] idealnySrodekCiezkosci) {
		
		double dlugoscMapyDuzej = (mapaSiedzen.size() -1) /2.0 + idealnySrodekCiezkosci[1];
		double szerokoscMapyDuzej = (mapaSiedzen.get(0).length -1) /2.0 + idealnySrodekCiezkosci[0];
		
		double dlugoscMapyMalej = (mapaSiedzen.size() -1) /2.0 - idealnySrodekCiezkosci[1];
		double szerokoscMapyMalej = (mapaSiedzen.size() -1) /2.0 - idealnySrodekCiezkosci[0];
		
		double szerokoscMapy = (mapaSiedzen.size() -1) / 2.0;
		double dlugoscMapy = (mapaSiedzen.size() -1) / 2.0;
		
		double srodekCiezkosciMapyX = szerokoscMapy / 2.0;
		double srodekCiezkosciMapyY = dlugoscMapy / 2.0;
		
		double obecnySrodekX = getWeightCenter(mapaSiedzen)[0] + idealnySrodekCiezkosci[0];
		double obecnySrodekY = getWeightCenter(mapaSiedzen)[1] + idealnySrodekCiezkosci[1];
		
		double procentoweWywazenie = 0;
		
		//strefa I
		if (obecnySrodekX > 0 && obecnySrodekY < 0) {
			
			
			
		}
		
		//strefa II
		else if (obecnySrodekX < 0 && obecnySrodekY < 0) {
			
			
			
		}
		
		//strefa III
		else if (obecnySrodekX < 0 && obecnySrodekY > 0) {
			
			
			
		}
		
		//strefa IV
		else if (obecnySrodekX > 0 && obecnySrodekY > 0) {
			
			double gradient = obecnySrodekY / obecnySrodekX;
			
			double punktPrzecieciaZPionemY = gradient * szerokoscMapyMalej / 2.0;
			
			double punktPrzecieciaZPoziomemX = (obecnySrodekX * (obecnySrodekY + (dlugoscMapyMalej / 2.0))) / obecnySrodekY;
			
			double dystansDoPrzecieciaPionu = Math.pow(Math.pow(obecnySrodekX - (dlugoscMapyMalej / 2.0), 2) + Math.pow(obecnySrodekY - punktPrzecieciaZPionemY, 2), 0.5);
			
			double dystansDoPrzecieciaPoziomu = Math.pow(Math.pow(punktPrzecieciaZPoziomemX, 2) + Math.pow(szerokoscMapyMalej, 2), 0.5);
			
			if (dystansDoPrzecieciaPionu < dystansDoPrzecieciaPoziomu) {
				
				double dystansDoSrodkaCiezkosci = Math.pow(Math.pow(obecnySrodekX, 2) + Math.pow(obecnySrodekY, 2), 0.5);
				procentoweWywazenie = (dystansDoPrzecieciaPionu - dystansDoSrodkaCiezkosci) / dystansDoPrzecieciaPionu;
				
			}
			
			else {
				
				double dystansDoSrodkaCiezkosci = Math.pow(Math.pow(obecnySrodekX, 2) + Math.pow(obecnySrodekY, 2), 0.5);
				procentoweWywazenie = (dystansDoPrzecieciaPoziomu - dystansDoSrodkaCiezkosci) / dystansDoPrzecieciaPoziomu;

				
			}
			
		}
		
		//strefa V
		else if (obecnySrodekX == 0 && obecnySrodekY < 0) {
			
			
			
		}
		
		//strefa VI
		else if (obecnySrodekX < 0 && obecnySrodekY == 0) {
			
			
			
		}
		
		//strefa VII
		else if (obecnySrodekX == 0 && obecnySrodekY > 0) {
			
			
			
		}
		
		//strefa VIII
		else if (obecnySrodekX > 0 && obecnySrodekY == 0) {
			
			
			
		}
		
		//strefa IX
		else if (obecnySrodekX == 0 && obecnySrodekY == 0) {
			
			procentoweWywazenie =1;
			
		}
		
		System.out.println("PROCENTOWE WYWAZENIE: " + Double.toString(procentoweWywazenie));
		
	}*/
	
	public static double[] getWeightCenter(ArrayList<Seat[]> mapaSiedzen) {

		int numberOfSeatsInRow = mapaSiedzen.get(0).length;
		int numberOfRows = mapaSiedzen.size();
		
		double centerOfRow = (numberOfSeatsInRow -1) / 2.0;
		double centerOfAllRows = (numberOfRows -1) / 2.0;
		
		//System.out.println("CWP, srodek_rzedow:" + Double.toString(centerOfRow));
		//System.out.println("CWP, srodek_kolumn:" + Double.toString(centerOfAllRows));
		
		double delta_X = 0;
		double delta_Y = 0;
		
		int takenSeats = 0;
		
		int liczbaZajetychMiejsc = 0;
		
		for (int rowIndex = 0; rowIndex < numberOfRows; rowIndex++) {
			
			for (int seatIndex = 0; seatIndex < numberOfSeatsInRow; seatIndex++) {
				
				if (mapaSiedzen.get(rowIndex)[seatIndex].getStatus() == Seat.TAKEN) {
					
					//System.out.println("ZAJETE X:" + Integer.toString(seatIndex) + " Y:" + Integer.toString(rowIndex));
					liczbaZajetychMiejsc++;
					
					if (seatIndex != centerOfRow) {
						
						delta_X += -centerOfRow + seatIndex;
						
					}
					 
					if (rowIndex != centerOfAllRows) {
						
						delta_Y += -centerOfAllRows + rowIndex;
						
					}
					
					++takenSeats;
					
				}

				
			}
			
		}
		
		//System.out.println("ZAJETE MIEJSCA CWP: " + Integer.toString(liczbaZajetychMiejsc));
		
		double delta_X_ostateczna = delta_X;
		double delta_Y_ostateczna = delta_Y;
		
		if (takenSeats > 0) {
		delta_X_ostateczna /= takenSeats;
		delta_Y_ostateczna /= takenSeats; }
		
		//System.out.println("CWP, sumaDeltaX:" + Double.toString(delta_X_ostateczna));
		//System.out.println("CWP, sumaDeltaY:" + Double.toString(delta_Y_ostateczna));
		
		return new double[] {delta_X_ostateczna, delta_Y_ostateczna};
		
	}

}
